#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void IC_Init(void)
{
	//第一步，RCC开启时钟，把GPIO和TIM的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第二步，GPIO初始化，把GPIO配置成输入模式(一般选择上拉输入或者浮空输入模式)
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第三步，配置时基单元，让CNT计数器在内部时钟的驱动下自增运行
	TIM_InternalClockConfig(TIM3);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数（计数有向上、向下、中央对齐计数）
	/*定时时间决定于以下俩个对象*/
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//如果信号频率太低，CNT计数值可能会溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//这个值决定了测周法的标准频率fc (由72MHz/预分频器（PSC）直接生成，不用输出，不需要ARR的处理)  
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值，高级定时器才有，TIM2为通用定时器，故置零
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	//第四步，配置输入捕获单元：包括滤波器、极性、直连通道还是交叉通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择输入捕获通道
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//配置输入捕获的滤波器（如果信号有噪声， 可以增大滤波器参数，可以有效避免干扰）
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器就是对信号本身进行计次了，会改变频率(目前不分频，可选2，4，8分频)
	TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;//选择触发信号哪个引脚输入(目前为直连通道)
	TIM_ICInit(TIM3,&TIM_ICInitStructure);
	//第五步，选择从模式的触发源：触发源选择为TI1FP1
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	//第六步，选择触发之后执行的操作：执行Reset操作
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	//调用TIM_Cmd函数，开启定时器
	TIM_Cmd(TIM3,ENABLE);
	/*当我们需要读取最新一个周期的频率时，直接读取CCR寄存器，然后按照fc/N,计算一下就行了*/
}

uint32_t IC_GetFreq(void)
{
	//N = TIM_GetCapture1(TIM3):N就是读取CCR的值 fx =fc / N
	/*目前这个函数返回的是最新一个周期的频率值，单位是Hz*/
	return 1000000 / (TIM_GetCapture1(TIM3)+1);
}
